package com.lhl.mq.mqServer.core;

import com.sun.org.apache.bcel.internal.generic.LineNumberGen;

import java.io.Serializable;
import java.util.Arrays;
import java.util.UUID;

/**
 * 表示一个要传递的信息
 * 此处的 message 对象，是需要能够在网络上传输的，并且也是需要能写入到文件中,
 * 此处需要对 Message 进行序列化和反序列化
 * 此处使用 标准库 自带的 序列化/反序列化 操作
 *
 */
public class Message implements Serializable {
    //Message 的属性
    private BasicProperties basicProperties = new BasicProperties();
    //Message 的正文
    private byte[] body;
    //如果 message 需要持久化存储的化，后续会存续到文件中
    //在查找某个文件时，使用下面的两个偏移量来表示
    //[offsetBeg，offsetEnd)
    //这两个属性不需要被序列化到文件中，此时消息一旦被写入到文件中，所在的位置就固定了，并不需要单独存储
    //这两个属性存在的目的，主要就是为了让内存中的 Message 对象，能够快速的找到对应的硬盘上的 Message 的位置
    private transient long offsetBeg = 0; //消息数据的开头距离文件开头的位置的偏移（字节）
    private transient long offsetEng = 0;//消息数据的结尾距离文件开头的位置的偏移（字节）
    //表示该消息在文件中是否有效（针对文件中的消息）
    private byte isValid = 0x1;


    public static Message createMessageWithId(String routingKey,BasicProperties basicProperties,byte[] body){
        Message message = new Message();

        if (basicProperties != null){
            message.setBasicProperties(basicProperties);
        }
        message.setRoutingKey(routingKey);
        message.setMessageId("M-"+UUID.randomUUID());
        message.setBody(body);

        return message;
    }


    public int getDeliverMode(){
        return basicProperties.getDeliverMode();
    }

    public void setDeliverMode(int deliverMode){
        basicProperties.setDeliverMode(deliverMode);
    }

    public String getRoutingKey(){
        return basicProperties.getRoutingKey();
    }

    public void setRoutingKey(String routingKey){
        basicProperties.setRoutingKey(routingKey);
    }

    public String getMessageId(){
        return basicProperties.getMessageId();
    }

    public void setMessageId(String id){
        basicProperties.setMessageId(id);
    }


    public BasicProperties getBasicProperties() {
        return basicProperties;
    }

    public void setBasicProperties(BasicProperties basicProperties) {
        this.basicProperties = basicProperties;
    }

    public byte[] getBody() {
        return body;
    }

    public void setBody(byte[] body) {
        this.body = body;
    }

    public long getOffsetBeg() {
        return offsetBeg;
    }

    public void setOffsetBeg(long offsetBeg) {
        this.offsetBeg = offsetBeg;
    }

    public long getOffsetEng() {
        return offsetEng;
    }

    public void setOffsetEng(long offsetEng) {
        this.offsetEng = offsetEng;
    }

    public byte getIsValid() {
        return isValid;
    }

    public void setIsValid(byte isValid) {
        this.isValid = isValid;
    }

    @Override
    public String toString() {
        return "Message{" +
                "basicProperties=" + basicProperties +
                ", body=" + Arrays.toString(body) +
                ", offsetBeg=" + offsetBeg +
                ", offsetEng=" + offsetEng +
                ", isValid=" + isValid +
                '}';
    }
}
